λ°μ΄ν°λ² μ΄μ€ 쿼리 ν₯μμ μΈκΈν λ, μΈλ±μ€λ νμ λΉ μ§μ§ μκ³ λ±μ₯νλ νλͺ© μ€ νλμ λλ€. μ 쿼리 ν₯μμλ μΈλ±μ€μ λν μ κΈ°κ° νμ λμ€λ κ±ΈκΉμ?? μ΄λ² κΈμμ λ°μ΄ν° I/O μμ μ λν΄μ κ·Όλ³Έμ μΌλ‘ μ΄ν΄λ³΄λ©΄μ μΈλ±μ€μ λν΄μ μ‘°κΈ λ μμ보λ μκ°μ κ°μ Έλ³΄λ €κ³ ν©λλ€.
μ μ₯ 맀체λ₯Ό μ¬μ©νλ λ°©μ
μ»΄ν¨ν°μ CPUλ λ©λͺ¨λ¦¬μ²λΌ μ κΈ°μ νΉμ±μ κ°μ§κ³ μλ μ₯μΉμ μ±λ₯μ 짧μ μκ° λμ λΉ λ₯Έ μλλ‘ λ°μ νμ§λ§ λμ€ν¬ κ°μ κΈ°κ³μ μ₯μΉμ μ±λ₯μ μλμ μΌλ‘ λλ¦¬κ² λ°μ μ νμ΅λλ€. μ΄λ κ² μκΈ° λμ€ν¬ μνμ μμ‘΄νλ νλ λμ€ν¬μ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ μ΅κ·Όμλ SSD λλΌμ΄λΈλ₯Ό μ¬μ©ν©λλ€. SSDλ κΈ°μ‘΄ νλ λμ€ν¬ λλΌμ΄λΈμμ λ°μ΄ν°λ₯Ό μ μ₯νλ μνμ μ κ±°νκ³ νλ μ λ©λͺ¨λ¦¬λ₯Ό μ₯μ°©νκ³ μμ΅λλ€. μ΄ λλ¬Έμ κΈ°κ³μ μΌλ‘ μνμ νμ μμΌλ λμ§ μμ μμ£Ό 빨리 λ°μ΄ν°λ₯Ό μ½μ΄μ¬ μ μμ΅λλ€.
μ΄λ¬ν λ°μ΄ν°λ₯Ό μ½μ΄μ€λ μμ μ μμ°¨ I/Oμ λλ€ I/Oλ‘ κ΅¬λΆμ ν μ μμ΅λλ€.
λμ€ν¬μ ν€λλ₯Ό μμ§μ΄μ§ μκ³ ν λ²μ λ§μ λ°μ΄ν°λ₯Ό μ½λ μμ°¨ I/Oμμλ SSDμ νλ λμ€ν¬ λλΌμ΄λ²μ μ±λ₯ μ°¨μ΄κ° κ±°μ λ°μνμ§ μμ΅λλ€. νμ§λ§ μ€μ λ°μ΄ν°λ² μ΄μ€ μλ²μ μμ λΉμ€μμ ν λ²μ λ§μ μμ λ°μ΄ν°λ₯Ό μ½λ λΉμ€μ ν¬μ§κ° μμ΅λλ€. λλΆλΆμ λ°μ΄ν°λ² μ΄μ€ μλ²μ μμ μ μμ λ°μ΄ν°λ₯Ό μ½κ³ μ°λ μμ μ΄λ©°, μ΄λ¬ν μμ μ λλ€ I/Oλ₯Ό ν΅ν΄μ μνλκ² λ©λλ€. λλ€ I/Oκ° λ°μνλ©΄ κ·Έ λ§νΌ λμ€ν¬ ν€λμ μμΉ μ΄λμ΄ λ§μ΄ λ°μνκΈ° λλ¬Έμ, λμ€ν¬ ν€λμ μ΄λμ΄ μλ SSD λλΌμ΄λ²κ° ν¨μ¬ μ’μ μ±λ₯μ λΈλ€κ³ ν μ μμ΅λλ€.
λλ€ I/Oμ μμ°¨ I/O
λλ€ I/O λΌλ ννμ νλ λμ€ν¬ λλΌμ΄λ²μ μνμ λλ €μ μ½μ΄μΌ ν λ°μ΄ν°κ° μ μ λ μμΉλ‘ λμ€ν¬ ν€λλ₯Ό μ΄λμν¨ λ€μ λ°μ΄ν°λ₯Ό μ½λ κ²μ μλ―Ένλλ°, μμ°¨ I/O λν μ리λ κ°μ΅λλ€.
νμ§λ§ μ°¨μ΄κ° μκΈ°λ μ μ μμ°¨ I/Oλ 3κ°μ νμ΄μ§λ₯Ό λμ€ν¬μ μ°ΎκΈ° μν΄ 1λ² μμ€ν μ½μ μμ²νμ§λ§, λλ€ I/Oλ 3κ°μ νμ΄μ§λ₯Ό μ°ΎκΈ° μν΄ 3λ² μμ€ν μ½μ μμ²νλ€λ μ μ λλ€. μ¦, μμ°¨ I/Oκ° λλ€ I/Oμ λΉν΄μ μ½ 3λ°° μ λ λΉ λ₯΄λ€κ³ ν μ μμΌλ©°, λμ€ν¬μ μ±λ₯μ λμ€ν¬ ν€λμ μμΉ μ΄λ μμ΄ μΌλ§λ λ§μ λ°μ΄ν°λ₯Ό ν λ²μ μ½κ³ μ°λκ°μ λ°λΌ κ²°μ λλ€κ³ ν μ μμ΅λλ€.
SSDμμλ λμ€ν¬ μνμ κ°μ§μ§ μκΈ° λλ¬Έμ μμ°¨ I/Oμ λλ€ I/Oκ° μ°¨μ΄κ° μμ κ²μΌλ‘ 보μ΄μ§λ§, SSD λλΌμ΄λ²μμλ λλ€ I/Oλ μμ°¨ I/Oμ λΉν΄ μ 체 μ²λ¦¬λμ΄ λ¨μ΄μ§λλ€.
μ¬κΈ°μ μ°λ¦¬λ μΈλ±μ€λ₯Ό μ¬μ©νλ λͺ©μ μ μ μ μμ΅λλ€. μ¬μ€ 쿼리λ₯Ό νλν΄μ λλ€ I/Oλ₯Ό μμ°¨ I/Oλ‘ λ³κ²½ν΄μ μ€νν λ°©λ²μ κ±°μ μλ€κ³ ν μ μμ΅λλ€. μ¦, λλ€ I/Oλ₯Ό μμ°¨ I/Oλ‘ λ³κ²½νμ¬ μ±λ₯μ ν₯μμν€λ κ²μ΄ μλλΌ λλ€ I/Oλ₯Ό μ€μ¬μ λ°μ΄ν°λ² μ΄μ€ μ±λ₯μ ν₯μμν€λ κ²μ΄ λͺ©μ μ΄λ©°, λͺ©μ μ μ΄λ£¨κΈ° μν μλ¨μΌλ‘ μΈλ±μ€λ₯Ό μ¬μ©νλ€κ³ ν μ μμ΅λλ€.
μΈλ±μ€κ° μνλλ μ리
μΈλ±μ€λ κ²μ μλλ₯Ό λΉ λ₯΄κ² νκΈ° μν΄μ λ°μ΄ν°λ² μ΄μ€μ 곡κ°μ νΉμ 컬λΌλ€μ μ λ ¬νλ μλ£κ΅¬μ‘°λΌκ³ ν μ μμ΅λλ€. μ¬κΈ°μ μ ν¬κ° μ΄ν΄λ³΄μμΌ ν μ μ βλ°μ΄ν°λ² μ΄μ€ 곡κ°μ νΉμ 컬λΌλ€μ μ λ ¬νλ€β μ λλ€. κ°λ€μ΄ νμ μ λ ¬λμ΄ μκΈ° λλ¬Έμ μ°Ύκ³ μ νλ κ°μ λΉ λ₯΄κ² μ°Ύμμ¬ μ μλ κ² μ λλ€. μ΄λ¬ν μΈλ±μ€λ InnoDBμμλ B-TreeλΌλ μλ£κ΅¬μ‘°λ₯Ό ν΅ν΄μ κ° λ°μ΄ν°λ€μ κ΄λ¦¬ν©λλ€.
B-Tree μΈλ±μ€
μΌλ°μ μΌλ‘ InnoDBμμλ B-Tree κΈ°λ°μ μκ³ λ¦¬μ¦μ μ¬μ©ν μΈλ±μ€λ₯Ό μ¬μ©ν©λλ€. (μ ννκ²λ μ‘°κΈ λ³νλ B+Treeλ₯Ό μ¬μ©ν©λλ€)
μΌλ°μ μΌλ‘ B-Treeλ νΈλ¦¬ ꡬ쑰μ μ΅μλ¨μ λ£¨νΈ λ Έλκ° μ‘΄μ¬νκ³ , κ·Έ νμμ μμ λ Έλλ€μ΄ λΆμ΄ μλ ννμ λλ€. μ¬κΈ°μ κ°μ₯ νμμ μλ μμ λ Έλλ₯Ό 리ν λ ΈλλΌκ³ λͺ μΉνλλ°, 리ν λ Έλλ νμ μ€μ λ°μ΄ν° λ μ½λλ₯Ό μ°Ύμκ°κΈ° μν μ£Όμκ°μ κ°μ§κ³ μμ΅λλ€. νΉν InnoDBμμλ κΈ°λ³Έμ μΌλ‘ ν μ΄λΈμ λ μ½λλ€μ΄ PKμ μμλλ‘ μ λ ¬λμ΄ μ μ₯λκΈ° λλ¬Έμ 물리μ μΌλ‘ ν μ΄λΈ λ μ½λλ€μ΄ μ μ₯λλ€κ³ ν μ μμ΅λλ€.
μ΄λ κ² νΈλ¦¬ ννλ‘ κ΅¬μΆλ μΈλ±μ€λ₯Ό κ²μνλ κ³Όμ μ νΈλ¦¬ νμμ΄λΌκ³ λΆλ₯΄λλ°, μ΅μλ¨ λ£¨νΈ λ Έλμμ μνλ κ°μ΄ μλ 리ν λ Έλλ₯Ό μ°Ύλ λ°©μμΌλ‘ λμμ μνν©λλ€.
μΈλ±μ€λ₯Ό ν΅ν λ μ½λ μ½κΈ°
μΈλ±μ€λ₯Ό ν΅ν΄ ν μ΄λΈμ λ μ½λλ₯Ό μ½λ κ²μ μΈλ±μ€λ₯Ό κ±°μΉμΉ μκ³ λ°λ‘ ν μ΄λΈμ λ μ½λλ₯Ό μ½λ κ²λ³΄λ€ λμ λΉμ©μ΄ λλ μμ μ λλ€. (λλ€ I/Oλ‘ λμνκΈ° λλ¬Έ)
μλ₯Ό λ€μ΄, ν μ΄λΈμ λ μ½λκ° 100λ§ κ±΄μ΄ μ μ₯λμ΄ μλ€κ³ κ°μ νκ³ , κ·Έ μ€μμ 50λ§ κ±΄μ μ½μ΄μΌ νλ μΏΌλ¦¬κ° μλ€κ³ κ°μ μ ν΄λ³΄κ² μ΅λλ€. μ 체 ν μ΄λΈμ λͺ¨λ μμ°¨μ μΌλ‘ μ½μ΄μ νμ μλ 50λ§ κ±΄μ λ²λ¦¬λ κ²μ΄ ν¨μ¨μ μΈμ§, μΈλ±μ€λ₯Ό ν΅ν΄ λλ€νκ² μ½μ΄μ 50λ§ κ±΄λ§ μ½μ΄ μ€λ κ²μ΄ ν¨μ¨μ μΈμ§λ₯Ό νλ¨ν μ μμ΄μΌ ν©λλ€.
μΌλ°μ μΌλ‘ DBMSμ μ΅ν°λ§μ΄μ μμλ μΈλ±μ€λ₯Ό ν΅ν΄ λ μ½λ 1건μ μ½λ κ²μ΄ ν μ΄λΈμμ μ§μ λ μ½λ 1건μ μ½λ κ²λ³΄λ€ 4 ~ 5λ°° μ λ λΉμ©μ΄ λ λ§μ΄ λ€μ΄κ°λ€κ³ ν©λλ€. μ¦, μΈλ±μ€λ₯Ό ν΅ν΄ μ½μ΄μΌ ν λ μ½λμ 건μκ° μ 체 ν μ΄λΈ λ μ½λμ 20 ~ 25%λ₯Ό λμ΄μλ©΄ μΈλ±μ€λ₯Ό μ΄μ©νμ§ μκ³ ν μ΄λΈμ λͺ¨λ μ§μ μ½λ λ°©μμΌλ‘ μ²λ¦¬νλκ² ν¨μ¨μ μ΄λΌκ³ ν μ μμ΅λλ€.
B-Tree μλ£κ΅¬μ‘°μμμ μΈλ±μ€ μν λ°©λ²
μΈλ±μ€ λ μΈμ§ μ€μΊ
μΈλ±μ€ λ μΈμ§ μ€μΊμ κ²μν΄μΌ ν μΈλ±μ€μ λ²μκ° κ²°μ λμμ λ μ¬μ©νλ λ°©μμ λλ€. μΈλ±μ€ μ κ·Ό λ°©λ² κ°μ΄λ° κ°μ₯ λνμ μΈ μ κ·Ό λ°©μμΌλ‘, μΈλ±μ€ μ¬μ©μ μ΅μ νλ λ°©λ² μ€ νλλΌκ³ ν μ μμ΅λλ€.
λ£¨νΈ λ Έλμμ μ°Ύκ³ μ νλ μ΅μ΄μ 리ν λ Έλλ₯Ό νμν ν, ν΄λΉ 리ν λ Έλμ μ°κ²°λ 리ν λ Έλλ₯Ό μ ν νμνλ λ°©λ²μΌλ‘ λμν©λλ€. μ΄λ¬ν μΈλ±μ€ λ μΈμ§ μ€μΊ λ°©μμ ν¬κ² 2κ°μ§ λ°©λ²μΌλ‘ λΆλ₯ν μ μμ΅λλ€.
- μ€μ μΈλ±μ€ λ°μ΄ν°λ§ μ½λ κ²½μ°
- μ€μ λ°μ΄ν° νμΌμ λ μ½λλ₯Ό μ½μ΄μμΌ νλ κ²½μ°
μμ μ€μ λ°μ΄ν° νμΌμ λ μ½λλ₯Ό μ½μ΄μμΌ νλ κ²½μ°μλ λλ€ λμ€ν¬ I/Oκ° λ°μνκ² λ©λλ€. λ μ½λ ν 건 λ¨μλ‘ λλ€ I/Oκ° λ°μνκΈ° λλ¬Έμ μ΄λ₯Ό μ μν΄μ μΈλ±μ€λ₯Ό μ€μ ν΄μΌ ν©λλ€.
λ§μ½ μ΄λ κ² μΈλ±μ€λ₯Ό μ¬μ©νλ©΄μλ λ°μ΄ν° νμΌμ λ μ½λλ₯Ό μ½μ΄μ€μ§ μλλ‘ νκΈ° μν΄μλ 컀λ²λ§ μΈλ±μ€λΌλ λ°©λ²μ μ¬μ©ν΄μΌ ν©λλ€. μ°Ύκ³ μ νλ λ μ½λμ κ°λ€μ μΈλ±μ€μ μ μ₯νκΈ° λλ¬Έμ λλ€ I/Oκ° μ€μ΄λ€κ³ μ‘°νμ λν μ±λ₯ μ΄μ μ κ°μ Έκ° μκ° μμ΅λλ€.
μΈλ±μ€ ν μ€μΊ
μΈλ±μ€ λ μΈμ§ μ€μΊκ³Ό λ§μ°¬κ°μ§λ‘ μΈλ±μ€λ₯Ό μ¬μ©νμ§λ§ μΈλ±μ€ λ μΈμ§ μ€μΊκ³Όλ λ¬λ¦¬ μΈλ±μ€μ μ²μλΆν° λκΉμ§ λͺ¨λ μ½λ λ°©μμ μΈλ±μ€ ν μ€μΊμ΄λΌκ³ ν©λλ€. μΌλ°μ μΌλ‘ μΈλ±μ€μ ν¬κΈ°λ ν μ΄λΈμ ν¬κΈ°λ³΄λ€ μμΌλ―λ‘ μ§μ ν μ΄λΈμ μ²μλΆν° λκΉμ§ μ½λ κ²λ³΄λ€λ μΈλ±μ€λ§ μ½λ κ²μ΄ ν¨μ¨μ μ λλ€.
λ¨, μΈλ±μ€λΏλ§ μλλΌ λ°μ΄ν° λ μ½λκΉμ§ λͺ¨λ μ½μ΄μΌ νλ€λ©΄ μ λ μ΄ λ°©μμΌλ‘ μ²λ¦¬κ° λμ§ μμ΅λλ€. μΏΌλ¦¬κ° μΈλ±μ€μ λͺ μλ μΉΌλΌλ§μΌλ‘ 쑰건μ μ²λ¦¬ν μ μλ κ²½μ°μ μ£Όλ‘ μ΄ λ°©μμ΄ μ¬μ©λ©λλ€.
μμ κ·Έλ¦Όμ 보면 μΈλ±μ€μ 리ν λ Έλμ μ μΌ μ(λ€)λ‘ μ΄λν ν, μ°κ²°λμ΄ μλ 리ν λ Έλλ€μ λ°λΌμ μ²μλΆν° λκΉμ§ νμνλ λ°©μμΌλ‘ λμνκ² λ©λλ€. μ΄λ μΈλ±μ€ λ μΈμ§ μ€μΊλ³΄λ€λ λΉ λ₯΄μ§ μμ§λ§ ν μ΄λΈ ν μ€μΊλ³΄λ€λ ν¨μ μ μ λμ€ν¬ I/Oκ° λ°μνκΈ° λλ¬Έμ ν¨μ¨μ μ΄λΌκ³ ν μ μμ΅λλ€.
λ€μ€ μ»¬λΌ μΈλ±μ€
μ€μ μλΉμ€μ© λ°μ΄ν°λ² μ΄μ€μμλ 2κ° μ΄μμ μΉΌλΌμ ν¬ν¨νλ μΈλ±μ€κ° λ λ§μ΄ μ¬μ©λ©λλ€. μ΄λ₯Ό λ€μ€ μ»¬λΌ μΈλ±μ€λΌκ³ λΆλ¦ λλ€. λ€μ€ μ»¬λΌ μΈλ±μ€κ° μ μ₯λλ κ΄μ μμ μ΄λ₯Ό μ΄ν΄λ³΄λ©΄ μμ 컬λΌμ μμ‘΄ν΄μ μ λ ¬μ΄ μ΄λ£¨μ΄μ§λ κ²μ νμΈν μ μμ΅λλ€. μ¦, λ€μ€ μΉΌλΌ μΈλ±μ€μμλ μΈλ±μ€ λ΄μμ κ° μ»¬λΌμ μμΉκ° λ§€μ° μ€μνλ€λ κ²μ μ μ μμ΅λλ€.
InnoDBμμμ μΈλ±μ€ μ λ ¬ λ° μ€μΊ λ°©ν₯
μΈλ±μ€λ₯Ό μμ±ν λ κ°λ°μκ° μ€μ ν μ λ ¬ κ·μΉμ λ°λΌμ μΈλ±μ€μ ν€ κ°μ νμ μ€λ¦μ°¨μμ΄λ λ΄λ¦Όμ°¨μμΌλ‘ μ λ ¬λμ΄ μ μ₯λ©λλ€. νμ§λ§ μΈλ±μ€κ° μ λ ¬λ κ²κ³Όλ λ€λ₯΄κ² μΈλ±μ€λ₯Ό μ½λ κ³³μ μμΉμ λ°λΌμ μ½λ λ°©ν₯μ΄ λ¬λΌμ§ μ μμ΅λλ€. μ΄λ κ² μΈλ±μ€λ₯Ό μ΄λ λ°©ν₯μΌλ‘ μ½μΌμ§λ κ° μΏΌλ¦¬μ λ°λΌμ μ΅ν°λ§μ΄μ μ μ€ν κ³νμ λ°λΌ κ²°μ λλ€κ³ ν μ μμ΅λλ€.
μΈλ±μ€λ MySQL 5.7 μ΄ν λ²μ μμλ νμ μ€λ¦μ°¨μμΌλ‘ μ λ ¬λμ΄ μμμ§λ§, μΈλ±μ€λ₯Ό μ΅λκ°λΆν° κ±°κΎΈλ‘ μ½μΌλ©΄ λ΄λ¦Όμ°¨μμΌλ‘ κ°μ κ°μ Έμ€κ² λ©λλ€. λ€μ κ·Έλ¦Όμ ν΅ν΄μλ μ΄λ₯Ό νμΈν μ μμ΅λλ€.
μ¦, μΈλ±μ€ μμ± μμ μ μ€λ¦μ°¨μ λλ λ΄λ¦Όμ°¨μμΌλ‘ μ λ ¬μ΄ κ²°μ λμ§λ§ μΏΌλ¦¬κ° μΈλ±μ€λ₯Ό μ¬μ©νλ μμ μ μΈλ±μ€λ₯Ό μ½λ λ°©ν₯μ λ°λΌ μ€λ¦μ°¨μ λλ λ΄λ¦Όμ°¨μ μ λ ¬ ν¨κ³Όλ₯Ό μ»μ μ μμ΅λλ€.
μ¬κΈ°μ λλΌμ΄ μ μ λ°μ΄ν° μ‘°ν μ, μ€λ¦μ°¨μκ³Ό λ΄λ¦Όμ°¨μμ μ±λ₯μ°¨μ΄κ° λ°μνλ€λ μ μ λλ€. μ± Real MySQL 8.0μ λ΄μ©μμλ μ μ μλ―μ΄, λ°μ΄ν°κ° 1μ²λ§κ±΄μ κΈ°μ€μΌλ‘ μ‘°ννμμ λ, μ€λ¦μ°¨μ μ λ ¬μ΄ λ΄λ¦Όμ°¨μ μ λ ¬λ³΄λ€ μ±λ₯μ΄ μ’λ€λ κ²μ μ μ μμ΅λλ€.
νμ§λ§ μ΄λΆλΆμ μ΄ν΄κ° μ λμ§ μμ΅λλ€. InnoDBλ κ° νμ΄μ§ κ°μ λλΈ λ§ν¬λ 리μ€νΈλ₯Ό ν΅ν΄μ μ μ§κ³Ό νμ§μ ν μ μκΈ° λλ¬Έμ λλ€. μ΄ λλ¬Έμ ν΄λΉ λ¨μλ§μΌλ‘λ μ μ±λ₯μ°¨μ΄κ° λ°μνλμ§ μ μ΄ν΄κ° λμ§ μμμ΅λλ€.
μ± κ³Ό κ²μμ ν΅ν΄ μ°Ύμλ³Έ κ²°κ³Ό μ€μ InnoDBμμλ λ€μ 2κ°μ§ μ΄μ λλ¬Έμ νμ§μΌλ‘ κ²μνλκ² λ리λ€λ κ²μ μ μ μμμ΅λλ€.
- νμ΄μ§ μ κΈμ΄ Forward Index Scanμ μ ν©ν ꡬ쑰
- νμ΄μ§ λ΄μμ μΈλ±μ€ λ μ½λλ λ¨λ°©ν₯μΌλ‘λ§ μ°κ²°λ ꡬ쑰 (Forwarded Single Linked Link)
νμ΄μ§ μ κΈμ΄ Forward Index Scanμ μ ν©ν ꡬ쑰
λ¨Όμ Forward Index Scanμ μ ν©ν ꡬ쑰μ λν΄μ μμλ³΄κ² μ΅λλ€.
InnoDBμ νμ΄μ§ μ κΈ λ°©μμ Forward Index Scanμ μ€μ¬μΌλ‘ ꡬνλμ΄ μλλ°, ν΄λΉ λ°©μμΌλ‘ μΈλ±μ€ 리ν νμ΄μ§λ₯Ό μ½μ λλ λ°μ μ½λμ κ°μ΄ Forward Scan μμλλ‘ νμ΄μ§μ μ κΈμ κ±Έκ³ ν΄μ νλ μμλ‘ λμνκ² λ©λλ€.
void btr_pcur_move_to_next_page(
/*=======================*/
btr_pcur_t* cursor, /*!< in: persistent cursor; must be on the
last record of the current page */
mtr_t* mtr) /*!< in: mtr */
{
// ... skip ...
page = btr_pcur_get_page(cursor);
next_page_no = btr_page_get_next(page, mtr);
// ... skip ...
buf_block_t* block = btr_pcur_get_block(cursor);
// λ€μ νμ΄μ§λ₯Ό μ°Ύμμ, μ κΈ νλ
next_block = btr_block_get(
page_id_t(block->page.id.space(), next_page_no),
block->page.size, mode,
btr_pcur_get_btr_cur(cursor) -> index, mtr);
next_page = buf_block_get_frame(next_block);
// ... skip ...
// λ€μ νμ΄μ§ μ κΈ νλ ν, νμ¬ νμ΄μ§μ μ κΈμ ν΄μ
btr_leaf_page_release(btr_pcur_get_block(cursor), mode, mtr);
// ... skip ...
}
κ·Έλ λ€λ©΄ Backward Index Scanμ νμ΄μ§ μ κΈμ νλνλ μ½λλ κ³Όμ° μ΄λ€ λ°©λ²μΌλ‘ λμμ νκ² λ κΉμ?? λ€μ μ½λλ₯Ό 보면 κ·Έ μ°¨μ΄λ₯Ό μ μ μμ΅λλ€.
void btr_pcur_move_backward_from_page(
/*=============================*/
btr_pcur_t* cursor, /*!< in: persistent cursor, must be on the first
record of the current page */
mtr_t* mtr) /*!< in: mtr */
{
// ... skip ...
// 컀μμ νμ¬ μν λ°±μ
btr_pcur_store_position(cursor, mtr);
mtr_commit(mtr); // Mini-transaction μ»€λ° (νμ΄μ§ μ κΈ ν΄μ )
mtr_start(mtr); // Mini-transaction μμ
// BTR_SEARCH_PREV λͺ¨λλ‘ μ»€μ 볡ꡬ
btr_pcur_restore_position(latch_mode2, cursor, mtr);
page = btr_pcur_get_page(cursor);
prev_page_no = btr_page_get_prev(page, mtr);
/* For intrinsic table we don't do optimistic restore and so there is
no left block that is pinned that needs to be released. */
if (!dict_table_is_intrinsic(
btr_cur_get_index(btr_pcur_get_btr_cur(cursor)) -> table)) {
if (prev_page_no == FIL_NULL) {
} else if (btr_pcur_is_before_first_on_page(cursor)) {
prev_block = btr_pcur_get_btr_cur(cursor) -> left_block;
// λΆνμμ νμ¬ νμ΄μ§ μ κΈ ν΄μ
btr_leaf_page_release(btr_pcur_get_block(cursor), latch_mode, mtr);
page_cur_set_after_last(prev_block, btr_pcur_get_page_cur(cursor));
} else {
/* The repositioned cursor did not end on an infimum
record on a page. Cursor repositioning acquired a latch
also on the previous page, but we do not need the latch:
release it. */
prev_block = btr_pcur_get_btr_cur(cursor) -> left_block;
// λΆνμμ μ΄μ νμ΄μ§ μ κΈ ν΄μ
btr_leaf_page_release(prev_block, latch_mode, mtr);
}
}
cursor -> latch_mode = latch_mode;
cursor -> old_stored = false;
}
μ½λμ μμ΄ λ무 λ§μ 100%λ μ΄ν΄λ λͺ»νμ§λ§ λλ΅ μ½λμ νλ¦μ μ΄ν΄λ³΄λ©΄ λ€μκ³Ό κ°λ€λ κ²μ νμΈν μ μμ΅λλ€.
- 컀μμ μνλ₯Ό μ μ₯νκ³ λ΄λΆμ λ―Έλ νΈλμμ μ 컀λ°ν΄μ λ―Έλ νΈλμμ λ²νΌλ₯Ό 리λ λ‘κ·Έ λ²νΌλ‘ 볡μ¬
- λ―Έλ νΈλμμ μ μ¬μμ
- 컀μμ μνλ₯Ό λ€μ 볡ꡬ
κ²°κ΅ ν΄λΉ μ½λλ₯Ό 보μμ λ, InnoDBμ 리ν νμ΄μ§λ λλΈ λ§ν¬λ 리μ€νΈλ‘ μ°κ²°λμ΄ μκΈ° λλ¬Έμ, μ΄λ λ°©ν₯μΌλ‘λ μ‘°νλ κ°λ₯ν©λλ€. νμ§λ§ νμ΄μ§ μ κΈ κ³Όμ μμ λ°λλ½μ λ°©μ§νκΈ° μν΄μ B-Treeμ μΌμͺ½μμ μ€λ₯Έμͺ½ μμλ‘λ§ μ κΈμ νλνλλ‘ νκ³ μμ΅λλ€. μ΄ λλ¬Έμ Forward Index Scanμ λΉν΄μ Backward Index Scanμ΄ ν¨μ¬ λ§μ 볡μ‘ν κ³Όμ μ μνν΄μ¬ 리μμ€κ° λ§μ΄ λ λ€λ κ²μ μ μκ° μμ΅λλ€.
νμ΄μ§ λ΄μμ μΈλ±μ€ λ μ½λλ λ¨λ°©ν₯μΌλ‘λ§ μ°κ²°λ ꡬ쑰
2λ²μ§Έ μ΄μ μΈ νμ΄μ§ λ΄μμ μΈλ±μ€ λ μ½λλ λ¨λ°©ν₯μΌλ‘λ§ μ°κ²°λ ꡬ쑰λΌλ λΆλΆμ λν΄μ μ΄ν΄λ³΄κ² μ΅λλ€.
InnoDB μ€ν λ¦¬μ§ μμ§μ΄ νΉμ λ μ½λλ₯Ό κ²μν λ, B-Treeλ₯Ό μ΄μ©ν΄μ κ²μ λμ λ μ½λκ° μ μ₯λ νμ΄μ§λ₯Ό κ²μνκ² λ©λλ€. μ΄ νμ΄μ§μλ μλ§μ λ μ½λκ° μ μ₯λκ² λλλ°, μΌλ°μ μΌλ‘ 600κ° μ΄μμ λ μ½λ(ν€λΉ 20 Byte)κ° μ μ₯λ μ μμ΅λλ€. νμ§λ§ 600κ°μ λ μ½λλ₯Ό λ§€λ² κ²μνλ κ²μ μλλ₯Ό μ νμν€λ μμ μ΄λΌ ν μ μμ΅λλ€. κ·Έλμ InnoDBλ νλμ νμ΄μ§μμ μ λ ¬λ λ μ½λ 4~8κ° μ λλ₯Ό λ¬Άμ΄ λ³λμ 리μ€νΈλ‘ κ΄λ¦¬νμ¬ μ΄λ₯Ό μ¬μ©ν©λλ€. μ΄λ¬ν 리μ€νΈλ₯Ό Page DirectoryλΌκ³ ν©λλ€.
μμ κ·Έλ¦Όμ ν΅ν΄μ 보면 InnoDB μ€ν λ¦¬μ§ μμ§μ νλμ νμ΄μ§μμ νΉμ ν€λ₯Ό κ²μν λ Page Directoryλ₯Ό λ°μ΄λ리 μμΉ λ°©μμΌλ‘ κ²μνλ©° κ²μ λμ ν€λ₯Ό ν¬ν¨νλ λνν€λ₯Ό κ²μνλ λ°©λ²μΌλ‘ μμ μ μννκ³ μμ΅λλ€. κ·Έλ¦¬κ³ λν ν€λ₯Ό μ°ΎμΌλ©΄ μΈλ±μ€ ν€ κ° μμλλ‘ μ°κ²°λ Linked Listλ₯Ό μ΄μ©ν΄μ λμ λ μ½λλ₯Ό κ²μνκ² λ©λλ€.
μ¬κΈ°μ μ μν΄μ λ΄μΌνλ μ μ B-Tree 리ν νμ΄μ§ ꡬ쑰μλ λ€λ₯΄κ², νμ΄μ§ λ΄λΆμ λ μ½λλ€μ Single Linked List κ΅¬μ‘°λ‘ κ΅¬μ±λμ΄ μλ€λ μ μ λλ€. μ΄ λλ¬Έμ Backward Index Scan λ°©μμ μ¬μ©νκ² λλ©΄ μΆκ°μ μΈ κ²μ μμ μ΄ νμν΄ μ€λ²ν€λκ° λ°μνλ κ²μ λλ€.
μ΅μ’ μ 리νλ©΄..?
κ²°κ΅ InnoDBμ 리ν νμ΄μ§λ λλΈ λ§ν¬λ 리μ€νΈλ₯Ό ν΅ν΄ μλ°©ν₯ κ²μμ΄ κ°λ₯νμ§λ§, μ€μ λ μ½λλ₯Ό μ μ₯λλ λ¨μμΈ νμ΄μ§ λ΄λΆμμ κ²μμ μνν λλ μ±κΈ λ§ν¬λ 리μ€νΈμ΄κΈ° λλ¬Έμ Backward Index Scanμ λν μ€λ²ν€λκ° λ°μνλ€λ κ² μ λλ€.
μμμλ λͺλ² μΈκΈνμ§λ§ InnoDBλ λ΄λΆμ μΌλ‘ νμ΄μ§μ λ μ½λλ₯Ό μ κ·Όν λλ§λ€, νμ΄μ§μ λν΄μ μ κΈμ κ±°λ λ°©μμΌλ‘ λμν©λλ€. μ΄λ Mutexλ₯Ό μ¬μ©νμ¬ μ κΈμ μννλ©° μ½κΈ° 쿼리λ€λΌλ¦¬λ νμ΄μ§ μ κΈμ μ μ νκΈ° μν΄μ κ²½μνκΈ° λλ¬Έμ, ν΄λΉ νμ΄μ§μ λμμ μ κ·Όνλ λ©ν° μ€λ λκ° λ§μμ§μλ‘ μ±λ₯ μν₯λλ λμ± μ»€μ§κ² λλ€κ³ ν μ μμ κ²μΌλ‘ 보μ λλ€.
λ§λ¬΄λ¦¬
μ§κΈκΉμ§ μΈλ±μ€μ λν΄μ μ΄ν΄λ³΄λ©΄μ μΈλ±μ€λ₯Ό μ μ¬μ©ν΄μΌ νλμ§, μΈλ±μ€ μλ£κ΅¬μ‘°μ μνλ°©λ²μ μ΄λ ν κ²λ€μ΄ μλμ§, 물리μ κ΄μ μμ μΈλ±μ€λ μ΄λ»κ² λμνλμ§λ₯Ό μ΄ν΄λ³΄λ μκ°μ κ°μ‘μ΅λλ€. νλ‘μ νΈλ₯Ό μ§ννλ©΄μ μΈλ±μ€λ₯Ό μ μ©ν΄ 보μμ§λ§, λ¨μν κ²μ μ±λ₯ ν₯μμ μν΄μ μ μ©ν μΈ‘λ©΄μ΄ μμμ΅λλ€. μ΄λ² λ΄μ©μ μ 리νλ©΄μ μ‘°κΈ λ μΈλ±μ€μ λν΄ μκ²λ κ² κ°μμ μ¬λ―Έμκ² ν΄λΉ λ΄μ©μ μ 리ν μ μμλ κ² κ°μ΅λλ€.
μ°Έκ³
- Real MySQL 8.0
- Kakao Tech
- https://blog.jcole.us/innodb/